package com.cyx.utils;

import io.jsonwebtoken.*;
import java.util.Date;
import java.util.Map;

public class JwtUtils {
    // 密钥
    private static final String SECRET_KEY = "Y3l4";

    // 令牌过期时间 ： 12小时 （单位：毫秒）
    private static final long EXPIRATION_TIME = 12*60*60*1000;

    /**
     * 生成JWT令牌
     * @param claims 自定义负载数据（如用户ID、用户名等）
     * @return 生成的JWT令牌字符串
     */
    public static String generateToken(Map<String,Object> claims){
        // 计算过期时间 （当前时间 + 12小时）
        Date expirationDate = new Date(System.currentTimeMillis() + EXPIRATION_TIME);
        return Jwts.builder()
                .setClaims(claims) // 设置自定义负载数据
                .setExpiration(expirationDate) // 设置过期时间
                .signWith(SignatureAlgorithm.HS256,SECRET_KEY) // 指定加密算法和密钥
                .compact();// 生成令牌
    }

    /**
     *  解析JWT令牌
     *  @param token 要解析的JWT令牌字符串
     *
     */
    public static Claims parseToken(String token){
        if(token == null || token.trim().isEmpty()){
            throw new RuntimeException("令牌不能为空");
        }
        try {
            return Jwts.parser()
                    .setSigningKey(SECRET_KEY)
                    .parseClaimsJws(token)
                    .getBody();
        }catch (ExpiredJwtException e){
            throw new RuntimeException("令牌已过期",e);
        }catch (SignatureException e){
            throw new RuntimeException("令牌签名无效 （可能是被篡改或密钥错误）",e);
        }catch (MalformedJwtException e){
            throw new RuntimeException("令牌格式错误",e);
        }catch (Exception e){
            throw new RuntimeException("令牌解析错误",e);
        }
    }

}
